package com.haust.community.controller;

import com.haust.community.event.Event;
import com.haust.community.event.EventProducer;
import com.haust.community.pojo.Comment;
import com.haust.community.pojo.DiscussPost;
import com.haust.community.service.CommentService;
import com.haust.community.service.DiscussPostService;
import com.haust.community.utils.CommunityConstant;
import com.haust.community.utils.HostHolder;
import com.haust.community.utils.RedisKeyUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import java.util.Date;

/**
 * @Auther: csp1999
 * @Date: 2020/11/25/15:03
 * @Description:
 */
@Controller
@RequestMapping("/comment")
public class CommentController implements CommunityConstant {

    @Autowired
    private CommentService commentService;

    @Autowired
    private HostHolder hostHolder;

    @Autowired
    private EventProducer eventProducer;

    @Autowired
    private DiscussPostService discussPostService;

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 新增帖子
     *
     * @param discussPostId
     * @param comment
     * @return
     */
    @RequestMapping(path = "/add/{discussPostId}", method = RequestMethod.POST)
    public String addComment(
            @PathVariable("discussPostId") int discussPostId, Comment comment) {
        comment.setUserId(hostHolder.getUser().getId());
        comment.setStatus(0);
        comment.setCreateTime(new Date());
        commentService.addComment(comment);

        // 触发评论事件
        Event event = new Event()
                .setTopic(TOPIC_COMMENT)// 事件主题:评论
                .setUserId(hostHolder.getUser().getId())// 触发事件的用户id
                .setEntityType(comment.getEntityType())// 评论的类型
                .setEntityId(comment.getEntityId())// 评论的id
                .setData("postId", discussPostId);// 帖子id 存入map
        // 如果评论的实体类型是 帖子
        if (comment.getEntityType() == ENTITY_TYPE_POST) {
            // 根据评论实体id查询该目标帖子信息
            DiscussPost target = discussPostService.findDiscussPostById(comment.getEntityId());
            event.setEntityUserId(target.getUserId());
            // 如果评论的实体类型是 评论
        } else if (comment.getEntityType() == ENTITY_TYPE_COMMENT) {
            // 根据评论实体id查询该目标评论信息
            Comment target = commentService.findCommentById(comment.getEntityId());
            event.setEntityUserId(target.getUserId());
        }
        // 消息生产者通知消息消费者
        eventProducer.fireEvent(event);

        // 如果评论的实体类型是帖子，即评论的对象是帖子
        if (comment.getEntityType() == ENTITY_TYPE_POST) {
            // 对帖子进行评论后触发事件：
            // 在 DiscussPostController 中，发布帖子后，触发事件：将刚发布帖子的消息通知订阅的消费者
            // 消费者在消费帖子类型事件时，会将帖子信息 传递到ES服务器存储
            // 而如果在 CommentController 中对帖子进行评论时，帖子的评论数量被修改，
            // 这时候就相当于修改了帖子的信息，所以需要再次将帖子信息上传到服务器，更新ES中原来帖子的信息！
            event = new Event()
                    .setTopic(TOPIC_PUBLISH)// 主题: 发帖
                    .setUserId(hostHolder.getUser().getId())// 当前用户id
                    .setEntityType(ENTITY_TYPE_POST)// 实体类型帖子
                    .setEntityId(discussPostId);// 实体id 为帖子id
            eventProducer.fireEvent(event);

            // 获取帖子分数集合的key
            String redisPostScoreKey = RedisKeyUtil.getPostScoreKey();
            // 向 redisPostScoreKey 中存入帖子id
            redisTemplate.opsForSet().add(redisPostScoreKey, discussPostId);
        }

        return "redirect:/discuss/detail/" + discussPostId;
    }
}
